package com.shark.uh.service;


import com.shark.uh.model.dto.roles.RoleDTO;
import com.shark.uh.model.dto.roles.RoleRemoveDTO;
import com.shark.uh.model.dto.roles.RoleSetDTO;
import com.shark.uh.model.entity.Roles;
import com.shark.uh.model.query.role.AssignedRolesQuery;
import com.shark.uh.model.query.role.AssignedUsersQuery;
import com.shark.uh.model.vo.RoleCreatorVO;
import com.shark.uh.model.vo.UserVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 负责提供角色相关服务
 */
public interface RolesService extends IService<Roles> {


    /**
     * 获取角色创建者列表
     *
     * @return 角色创建者列表
     */
    List<RoleCreatorVO> getCreators();


    /**
     * 条件查询角色列表
     *
     * @param roleName      角色名称
     * @param creatorUserId 创建者ID
     * @param status        角色状态
     * @param pageNo        页号
     * @param pageSize      每页条数的大小
     * @param sortBy        排序规则
     * @return 角色列表
     */
    List<RoleDTO> listConditional(String roleName, String creatorUserId, String status, Integer pageNo, Integer pageSize, String sortBy);


    /**
     * 创建角色
     *
     * @param roleName    角色名称
     * @param description 描述
     */
    void save(String roleName, String description);


    /**
     * 更新角色信息 （描述）
     *
     * @param roleId         角色ID
     * @param newDescription 新描述
     */
    void update(String roleId, String newDescription);


    /**
     * 删除角色
     *
     * @param roleId 角色ID
     */
    void remove(Long roleId);


    void assign(List<Long> roleIds, List<Long> userIds);

    /**
     * 获取被分配有此权限的用户列表。
     *
     * @param query 查询参数
     * @return 用户视图对象
     */
    List<UserVO> listAssignedUsers(AssignedUsersQuery query);


    /**
     * 获取用户拥有的所有角色
     *
     * @param query
     * @return
     */
    List<Roles> listAssignedRoles(AssignedRolesQuery query);

    /**
     * 禁用角色
     *
     * @param ids
     */
    void banRole(List<Long> ids);

    /**
     * 解禁角色
     *
     * @param ids
     */
    void unbanRole(List<Long> ids);

    /**
     * 为用户绑定角色
     *
     * @param roleSetDTO
     */
    void addRoleForUser(RoleSetDTO roleSetDTO);

    /**
     * 删除用户某个角色
     *
     * @param roleRemoveDTO
     */
    void deleteRoleFromUser(RoleRemoveDTO roleRemoveDTO);


}
